package com.project.aspect;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect //声明该类为切面类
public class ManAsPet {

    //申明目标对象的范围第一个*表示返回类型为任意返回类型
    //com.project.service.*.* 表示com。project.service包中所有的类中，所有的方法
    //(..)表示方法参数为任意类型
    //com.project.service..*.* 表示com.project.service包及其子包中所有类中，所有的方法
    @Before("execution(* com.project.service..*.*(..))")
    public void before(){
        System.out.println("前置通知");
    }

    @After("execution(* com.project.service..*.*(..))")
    public void after(){
        System.out.println("返回后通知");
    }

    @Around("execution(* com.project.service..*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕前");
        //执行目标方法,得到目标方法执行后的返回值
        Object returnObj = joinPoint.proceed();
        //得到目标对象
//        Object target = joinPoint.getTarget();
        System.out.println("环绕后");
        return returnObj;
    }
    //抛出异常通知，value表示目标对象和目标方法的范围
    //throwing表示用指定变量接收目标方法抛出异常
    @AfterThrowing(value = "execution(* com.project.service..*.*(..))",throwing = "e")
    public void pressException(JoinPoint joinPoint,Exception e){
        //得到目标对象的类全路径
        String targetName = joinPoint.getTarget().getClass().getName();
        //得到目标方法名
        String methodName = joinPoint.getSignature().getName();

        System.out.println("执行"+targetName+"的"+methodName+"，抛出"+e.getClass().getName());
    }
}
